package contracts;

import services.VilainService;
import utils.PowerVilain;
import utils.Sante;
import utils.TypeVilain;
import decorators.VilainDecorator;

public class VilainContract extends VilainDecorator implements VilainService{

	public VilainContract(VilainService delegate) {
		super(delegate);
	}

	/**
	 * checkInvariant verifie que les invariants sont bien respectes
	 * pour le service Vilain, ici il n'y a pas d'invariants.
	 */
	public void checkInvariant(){};

	@Override
	public TypeVilain getType() {
		return super.getType();
	}

	@Override
	public PowerVilain getPower() {
		return super.getPower();
	}

	@Override
	public int getX() {
		return super.getX();
	}

	@Override
	public int getY() {
		return super.getY();
	}

	@Override
	public Sante getVilainSante() {
		return super.getVilainSante();
	}

	@Override
	public int getNumero() {
		return super.getNumero();
	}

	@Override
	public void init(TypeVilain typevilain) throws ContractException {
		super.init(typevilain);

		this.checkInvariant();

		//\post getX(init(typevilain))=1

		if(getX() != 1){
			throw new PostconditionException("Valeur initiale de X invalide : different de 1.");
		}

		//\post getY(init(typevilain))=1	
		if(getY() != 1){
			throw new PostconditionException("Valeur initiale de Y invalide : different de 1.");
		}

		//\post getType(init(typevilain)) = typevilain
		if(!getType().equals(typevilain)){
			throw new PostconditionException("Type de Vilain invalide : different de TypeVilain.BALLONRANGE et TypeVilain.FANTOMEBLEU.");
		}

		//\post	if getType(init(typevilain)) = FANTOMEBLEU then getType(init(typevilain))=FANTOMEBLEU
		if(getType().equals(TypeVilain.FANTOMEBLEU)){
			if(!getPower().equals(PowerVilain.FANTOMEBLEU)){
				throw new PostconditionException("Pouvoir de Vilain incoherent avec le type du vilain (FANTOMEBLEU).");
			}
		}
		//\post if getType(init(typevilain)) = BALLONORANGE then getPower(init(typevilain))=BALLONORANGE
		if(getType().equals(TypeVilain.BALLONORANGE)){
			if(!getPower().equals(PowerVilain.BALLONORANGE)){
				throw new PostconditionException("Pouvoir de Vilain incoherent avec le type du vilain (BALLONORANGE).");
			}
		}
		
		//\post getVilainSante(init(typevilain)) = VIVANT
		if(!getVilainSante().equals(Sante.VIVANT)){
			throw new PostconditionException("Etat de sante initiale du vilain invalide : different de Sante.VIVANT");
		}
	
	}
}
